//
// Created by user on 2022/3/28.
//

#ifndef ACM_TEMPLATE_TEST_RUNNER_H
#define ACM_TEMPLATE_TEST_RUNNER_H

#include <bits/stdc++.h>

namespace Dis {
    // 测试运行器
    class test_runner {
        const std::string DEFAULT_PRE_TEST_POINT = "test";
        const std::string SUFFIX_TEST_DATA = ".in";
        const std::string SUFFIX_STD_ANSWER = ".std";
        const std::string SUFFIX_SOL_ANSWER = ".slo";

    private:
        // 自己的待测试函数
        void (*solve_fun_ptr)();
        // 标准函数
        void (*std_fun_ptr)();
        // 测试样例生成函数
        void (*test_data_fun_ptr)();
        // 测试点文件名前缀
        std::string test_point_pre;
        // 测试点保存路径
        std::string save_path;
        // 是否进行编号
        bool use_id;
        // 是否显示运行时间
        bool show_exec_time;

    public:
        test_runner(void (*solveFunPtr)(), void (*stdFunPtr)(), void (*testDataFunPtr)(), std::string _save_path);

        /**
         * 运行
         * @param cnt 多少次测试样例
         * @return 是否成功
         */
        bool run(int cnt);

        /**
         * 获取测试数据文件名
         * @param i 第几组
         * @return 文件名
         */
        std::string get_test_data_file_name(int i);

        /**
         * 获取标准答案文件名
         * @param i 第几组
         * @return 文件名
         */
        std::string get_std_answer_file_name(int i);

        /**
         * 获取测试答案文件名
         * @param i 第几组
         * @return 文件名
         */
        std::string get_solve_answer_file_name(int i);

        const std::string &get_test_point_pre() const;

        void set_test_point_pre(const std::string &testPointPre);

        bool is_use_id() const;

        void set_use_id(bool use_id);

        bool is_show_exec_time() const;

        void set_show_exec_time(bool showExecTime);
    };

}

#endif //ACM_TEMPLATE_TEST_RUNNER_H
